package com.okami.domain.order;

import com.okami.domain.customer.User;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;

/**
 * @author: TanJingyu
 * @create: 2020-12-05 17:43
 * // @Accessors(chain = true)：lombok注解，链式编程
 * // @Access(AccessType.FIELD)：数据库字段依据。FIELD：类的成员变量。PROPERTY：get方法。
 * // @EntityListeners(AuditingEntityListener.class)：自动设置修改时间
 **/
@Entity
@Table(name = "orders")
@Data
@Accessors(chain = true)
@Access(AccessType.FIELD)
@EntityListeners(AuditingEntityListener.class)
public class Order {
    /**
     *  IDENTITY: 数据库自增
     *  AUTO: 依靠一张hibernate_sequence表记录ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    /**
     *  版本号，实现数据库乐观锁
     */
    @Version
    private Long version;
    /**
     * 主要用于映射非数据库实体，只是创建了另一张一对多的关联表而已
     * 例如：订单有很多关联项，但是此时item在数据库中并没有单独的表，只是作为order_item中间表出现
     */
    @ElementCollection
    private List<Item> items;

    /**
     *  //@Enumerated：声明枚举
     */
    @Enumerated(EnumType.STRING)
    private OrderState state;

    /**
     *  此对象不会单独建表。
     *  会将此对象的字段建在orders表中。
     *  若想重写此对象中的某些字段名，用@AttributeOverrides注解
     */
    @Embedded
    private PaymentInformation paymentInformation;

    /**
     *  // @Temporal:截取时间值的哪部分，不用此注解默认为TIMESTAMP
     */
    @Temporal(TemporalType.TIMESTAMP)
    @CreatedDate
//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createdTime = new Date();

    @LastModifiedDate
    private Date lastModifiedDate;

    /**
     *  测试字段。
     *  经测试，java8的新特性localDate相关可以替代date
     */
    private LocalDateTime localDateTime;

    private String remarks;

    public enum OrderState {
        /**
         *  订单取消
         */
        CANCELLED;
    }
}
